﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Mindfor.Web.Data;
using NHibernate;
using NHibernate.Linq;

namespace Mindfor.Web.Modules.Vacancies
{
	public class VacanciesModule : ModuleBase
	{
		/// <summary>
		/// Custom role name for Vacancies Module. Vacancy Manager can add, edit and delete vacancies.
		/// </summary>
		public const string VacanciesRole = "VacancyManager";

		/// <summary>
		/// Default size of page with Vacancies
		/// </summary>
		public const string IndexPageSizeOption = "IndexPageSize";

		/// <summary>
		/// Default vacancy manager
		/// </summary>
		public const string DefaultRecruiterOption = "DefaultRecruiter";

		/// <summary>
		/// Default vacancy manager phone number
		/// </summary>
		public const string DefaultRecruiterPhoneOption = "DefaultRecruiterPhone";

		/// <summary>
		/// Default vacancy manager email address
		/// </summary>
		public const string DefaultRecruiterEmailOption = "DefaultRecruiterEmail";

		/// <summary>
		/// Register method: registgers module, creates custom vacancy module role, creates options.
		/// </summary>
		public override void Register(ModuleRegistrationData info)
		{
			base.Register(info);

			// create role if one does not exists
			Role role = info.Data.Query<Role>().FirstOrDefault(r => r.Name == VacanciesRole);
			if (role == null)
			{
				role = new Role()
				{
					Name = VacanciesRole,
					FriendlyName = "Менеджер вакансий",
					Description = "Позволяет управлять вакансиями"
				};
				using (ITransaction t = info.Data.BeginTransaction())
				{
					info.Data.Save(role);
					t.Commit();
				}
			}

			// create options
			bool optionsChanged = false;
			ModuleOption indexPageSizeOption = Options[IndexPageSizeOption];
			if (indexPageSizeOption == null)
			{
				indexPageSizeOption = new ModuleOption(IndexPageSizeOption, ModuleOptionType.Integer, 15, "Количество вакансий, отображаемых на одной странице пользователя.");
				Options.Add(indexPageSizeOption);
				optionsChanged = true;
			}

			ModuleOption defaultRecruiterOption = Options[DefaultRecruiterOption];
			if (defaultRecruiterOption == null)
			{
				defaultRecruiterOption = new ModuleOption(DefaultRecruiterOption, ModuleOptionType.String, "Специлист отдела кадров", "Сотрудник, отвечающий за работу с кадрами.");
				Options.Add(defaultRecruiterOption);
				optionsChanged = true;
			}

			ModuleOption defaultRecruiterPhoneOption = Options[DefaultRecruiterPhoneOption];
			if (defaultRecruiterPhoneOption == null)
			{
				defaultRecruiterPhoneOption = new ModuleOption(DefaultRecruiterPhoneOption, ModuleOptionType.String, "1234567890", "Номер телефона сотрудника, отвечающего за работу с кадрами.");
				Options.Add(defaultRecruiterPhoneOption);
				optionsChanged = true;
			}

			ModuleOption defaultRecruiterEmailOption = Options[DefaultRecruiterEmailOption];
			if (defaultRecruiterEmailOption == null)
			{
				defaultRecruiterEmailOption = new ModuleOption(DefaultRecruiterEmailOption, ModuleOptionType.String, "hr@email.here", "Адрес электронной почты сотрудника, отвечающего за работу с кадрами.");
				Options.Add(defaultRecruiterEmailOption);
				optionsChanged = true;
			}

			if (optionsChanged)
				Options.Save(info.Data);
		}
	}
}